平常我們的程式有沒有問題,都是用偵錯模式自己手動去看。
當程式很小的時候可以這樣測試。
但是當你的程式越來越大的時候,你可能很難一個一個去測試。甚至某些功能寫在很深的地方。不可能每次用 F5
跳啊跳,跳到要測試的地方。
單元測試的加入,提供你對你的程式信心。不會因為使用者亂輸入而出錯之類的。
而這個信心強度是依你的單元測試數量、品質、受測項目而提高。
.NET 中常見的單元測試框架有 MSTest
、NUnit
、XUnit
。每個框架各有有缺點,也各有其支持者。我在以前公司的方案裡,有的子專案用NUnit
、有的用XUnit
的情況。
Visual Studio 內建 MSTest
,而另外兩個則需要在專案中從 NuGet 安裝。本篇文章我們會使用 MSTest
來示範。
你可以從現有的程式碼按右鍵加入單元測試。
這邊我們使用預設選項
又或者從方案中,右鍵->加入->新增專案,選擇 MSTest
專案
看你的的專案選擇用.NET Framework 或 .NET Core 的 MSTest 版本
而單元測試的專案名稱,習慣會在結尾加上 Tests,如果你們公司有規定不同的命名,就依照公司規定就好。
現在我們就可以寫一個簡的的單元測試,以下是使用直接對程式碼右鍵產生的單元測試範本:
就跟作文會有起、承、轉、合一樣,單元測試則由 Arrange、Act、Assert 三個段落所組成
有些更簡單的測試可能只有 Act 和 Assert,沒有 Arrange。
現在我要幫前幾天寫的 Mapper,寫一個單元測試
[TestMethod()]
public void MapTest()
{
// Arrange
var userViewModel = new UserViewModel()
{
Id = 1,
Email = "test@test.com",
Name = "長庚"
};
// Act
var user = MyMapper.Map<UserViewModel, User>(userViewModel);
// Assert
Assert.AreEqual(userViewModel.Id, user.Id);
Assert.AreEqual(userViewModel.Email, user.Email);
Assert.AreEqual(userViewModel.Name, user.Name);
}
Assert
物件裡面提供了各種判斷是否符合的方法,這邊我使用Assert.AreEqual()
來判斷 user 的值是否跟 userViewModel 一樣。
接下來就執行測試,你可對方法右鍵來執行測試
或是開啟測試總管(Visual Studio 不同版本名稱不同)
點選三角形撥放鍵圖案,就可以進行測試。左邊是全部測試,右邊是測試指定項目。
在MSTest
中,能受測的方法一定要標示[TestMethod()]
,其類別也需要標示[TestClass()]
才會出現在測試總管中。
測試成功會標綠燈